package com.shan;

/**
 * Author: shanzheng <br/>
 * Description: 测试线程同步的案例，即锁机制<br/>
 * Date： 13:46 2017/8/29.<br/>
 * Modified By: <br/>
 */
public class SynchronizedThread extends Thread {
    /**
     * Description: 同步方法
     *
     * @author: shanzheng
     * @date: 14:10 2017/8/29
     * @return: void
     */
    private synchronized void testSynchronizedMethod() {
        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName()
                    + " testSynchronizedMethod:" + i);

            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    @Override
    public void run() {
        testSynchronizedMethod();
    }

    public static void main(String[] args) {
        /*第一种情况：可以同步的情况 start*/
//        SynchronizedThread t = new SynchronizedThread();
        /*启动线程，这种启动方式才能真正的实现多线程运行，
        * 运行时的线程名才为Thread
        * 调用顺序为： 1.先new出SynchronizedThread线程对象
        *              2.再启动start()-->调用run()方法
         *             3.run()方法调用testSynchronizedMethod()方法
        * */
//        t.start();
//        t.testSynchronizedMethod();
        /*第一种情况：可以同步的情况 end*/

        /*第二种情况：不可以同步的情况 start*/
        //不能同步的原因：因为此时两个线程的同步监视器不是同一个对象，不能起到同步的作用
        SynchronizedThread t1 = new SynchronizedThread();
        t1.start();
        SynchronizedThread t2 = new SynchronizedThread();
        t2.start();
        /*第二种情况：不可以同步的情况 end*/

        /*第三种情况：让第二种可以同步 start*/
        /*
            让其同步的办法：将testSynchronizedMethod()声明为静态方法,即在方法前加static修饰
            能同步的原因：这样两个线程的监视器是同一个对象（类对象），能够同步执行。
         */
//        SynchronizedThread t1 = new SynchronizedThread();
//        t1.start();
//        SynchronizedThread t2 = new SynchronizedThread();
//        t2.start();
        /*第三种情况：让第二种可以同步 start*/
    }
}
